package com.sheng.leetcode.year2025.month10.day02;

import org.junit.Test;

/**
 * @author by ls
 * @date 2025/10/10
 * <p>
 * 3100. 换水问题 II<p>
 * <p>
 * 给你两个整数 numBottles 和 numExchange 。<p>
 * numBottles 代表你最初拥有的满水瓶数量。在一次操作中，你可以执行以下操作之一：<p>
 * 喝掉任意数量的满水瓶，使它们变成空水瓶。<p>
 * 用 numExchange 个空水瓶交换一个满水瓶。然后，将 numExchange 的值增加 1 。<p>
 * 注意，你不能使用相同的 numExchange 值交换多批空水瓶。例如，如果 numBottles == 3 并且 numExchange == 1 ，则不能用 3 个空水瓶交换成 3 个满水瓶。<p>
 * 返回你 最多 可以喝到多少瓶水。<p>
 * <p>
 * 示例 1：<p>
 * 输入：numBottles = 13, numExchange = 6<p>
 * 输出：15<p>
 * 解释：上表显示了满水瓶的数量、空水瓶的数量、numExchange 的值，以及累计喝掉的水瓶数量。<p>
 * <p>
 * 示例 2：<p>
 * 输入：numBottles = 10, numExchange = 3<p>
 * 输出：13<p>
 * 解释：上表显示了满水瓶的数量、空水瓶的数量、numExchange 的值，以及累计喝掉的水瓶数量。<p>
 * <p>
 * 提示：<p>
 * 1 <= numBottles <= 100<p>
 * 1 <= numExchange <= 100<p>
 */
public class LeetCode3100 {

    @Test
    public void test() {
//        int numBottles = 13, numExchange = 5;
        int numBottles = 10, numExchange = 3;
        System.out.println(new Solution().maxBottlesDrunk(numBottles, numExchange));
    }
}

class Solution {
    public int maxBottlesDrunk(int numBottles, int numExchange) {
        // sum 是一共喝水的瓶数量，nul 是目前剩余空瓶子的数量
        int sum = 0, nul = 0;
        while ((numBottles + nul) / numExchange != 0) {
            // 每次把水喝完
            sum += numBottles;
            nul += numBottles;
            numBottles = 0;
            // nul / numExchange 是可以换多少瓶水，nul % numExchange 是剩余多少空瓶子
            while (nul >= numExchange) {
                nul -= numExchange;
                numBottles++;
                numExchange++;
            }
        }
        sum += numBottles;
        return sum;
    }
}
